(function(a) {}).length; // 1
(function(a = 5) {}).length; // 0
(function(a, b, c = 5) {}).length; // 2
/*
这是因为length属性的含义是， 该函数预期传入的参数个数。
某个参数指定默认值以后， 预期传入的参数个数就不包括这个参数了。
同理， 后文的 rest 参数也不会计入length属性。
*/
(function(...args) {}).length; // 0

//如果设置了默认值的参数不是尾参数，那么length属性也不再计入后面的参数了。直接从这个地方断掉
(function(a = 0, b, c) {}).length; // 0
(function(a, b = 1, c) {}).length; // 1


//作用域理解提升
var x = 1;

function foo(x, y = function() {
	x = 2;
}) {
	var x = 3;
	y();
	console.log(x);
}

foo() // 3
x // 1

var x = 1;

function foo(x, y = function() {
	x = 2;
}) {
	x = 3;
	y();
	console.log(x);
}

foo() // 2
x // 1
